package com.zhangh.summer.admin.support.ds.mysql.mapper;


import com.zhangh.summer.admin.support.ds.common.pager.DataPager;
import com.zhangh.summer.admin.support.ds.common.pager.Pager;
import com.zhangh.summer.admin.support.ds.mysql.common.DataSourceSupport;
import com.zhangh.summer.admin.support.ds.mysql.common.MybatisUtil;
import com.zhangh.summer.admin.support.spring.util.SpringBeanUtil;
import com.github.pagehelper.PageInfo;

import org.apache.ibatis.binding.MapperMethod;
import org.apache.ibatis.session.RowBounds;

import java.util.List;


public class TableMapper implements ITableMapper {
    private static final DataSourceSupport dataSourceSupport= SpringBeanUtil.getBeanByType(DataSourceSupport.class);
    private static TableMapper singleton = null;

    public static  TableMapper getInstance(){
        if(singleton == null){
            synchronized (TableMapper.class){
                if(singleton == null){
                    singleton = new TableMapper();
                }
            }
        }
        return singleton;
    }


   /* static {
        dataSourceSupport= SpringBeanUtil.getBeanByType(DataSourceSupport.class);
    }*/
    public TableMapper(){
        //this.dsName=dsName;
    }


    /**
     * 通过主键查询数据对象
     * @param cls 数据对象class
     * @param key 数据对象key
     * @param <M> 数据对象
     * @return
     */
    public <M> M  selectByPrimaryKey(Class<M> cls,Object key){
        String selectId= MybatisUtil.getNamespace(cls)+ ExampleEnum.selectByPrimaryKey;
        M m=this.dataSourceSupport.selectOne(selectId, key);
        return m;
    }



    /**
     * 通过expample查询数据对象集合
     * @param example 查询帮助类
     * @param <M> 数据对象类型
     * @return 数据对象List集合
     */
    public <M> List<M> selectByExample(Object example){
        String selectId= MybatisUtil.getNamespace(example.getClass())+ ExampleEnum.selectByExample;
        List<M> ls=this.dataSourceSupport.selectList(selectId, example);
        return ls;
    }

    /**
     * 通过example查询对象集合所有数据对象（blob列数据）
     * @param example 查询帮助类
     * @param <M> 数据对象类型
     * @return 数据对象List集合
     */
    public <M> List<M>  selectByExampleWithBLOBs(Object example){
        String selectId= MybatisUtil.getNamespace(example.getClass())+ExampleEnum.selectByExampleWithBLOBs;
        List<M> ls=this.dataSourceSupport.selectList(selectId, example);
        return ls;
    }

    /**
     * 通过example查询数据对象集合的第一条数据
     * @param example 查询帮助类
     * @param <M> 数据对象类型
     * @return 数据对象
     */
    public <M> M selectFirstByExample(Object example){
        String selectId= MybatisUtil.getNamespace(example.getClass())+ExampleEnum.selectByExample;
        RowBounds rowBounds = new RowBounds(1, 1);
        List<M> ls=this.dataSourceSupport.selectLimitedList(selectId, example, rowBounds);
        if(ls.size()>0){
            return  ls.get(0);
        }
        return null;
    }

    @Override
    public <M> M selectOneByExample(Object example) {
        String selectId= MybatisUtil.getNamespace(example.getClass())+ExampleEnum.selectByExample;
        M m=this.dataSourceSupport.selectOne(selectId,example);
        return m;
    }

    /**
     * 通过example查询结果总数
     * @param example 查询帮助类
     * @return 结果总数
     */
    public long countByExample(Object example){
        String countId= MybatisUtil.getNamespace(example.getClass())+ExampleEnum.countByExample;
        int count=this.dataSourceSupport.selectCount(countId, example);
        return count;
    }

/*    *//**
     * 通过example查询结果总数
     * @param example 查询帮助类
     * @return long类型结果总数
     *//*
    public long countByExampleLong(Object example){
        String countId= MybatisUtil.getNamespace(example.getClass())+ExampleEnum.countByExample;
        long count=this.dataSourceSupport.selectCountLong(countId, example);
        return count;
    }*/


    /**
     * 通过example删除数据对象
     * @param example 查询帮助类
     * @return 删除的数据条数
     */
    public int deleteByExample(Object example){
        String deleteId= MybatisUtil.getNamespace(example.getClass())+ExampleEnum.deleteByExample;

        int count=this.dataSourceSupport.delete(deleteId, example);
        return count;
    }

    /**
     * 插入数据对象
     * @param parameter 数据对象
     * @return 插入数据条数
     */
    public int  insert(Object parameter){
        String insertId= MybatisUtil.getNamespace(parameter.getClass())+ExampleEnum.insert;
        int count=this.dataSourceSupport.insert(insertId, parameter);
        return count;
    }

    /**
     * 有选择性插入数据对象（对象属性为空不更新到db）
     * @param parameter 数据对象
     * @return 插入数据条数
     */
    public int insertSelective(Object parameter){
        String insertId= MybatisUtil.getNamespace(parameter.getClass())+ExampleEnum.insertSelective;
        int count=this.dataSourceSupport.insert(insertId, parameter);
        return count;
    }

    /**
     *
     * @param recordList
     * @param <T>
     * @return
     */
    @Override
    public <T> int batchInsert(List<T> recordList,Class<T> cls) {
        String insertId= MybatisUtil.getNamespace(cls)+ExampleEnum.batchInsert;
        int count=this.dataSourceSupport.insert(insertId, recordList);
        return count;
    }

    /**
     * 通过example更新数据对象
     * @param record 数据对象
     * @param example 帮助类
     * @return 更新数据条数
     */
    public int updateByExample(Object record, Object example) {
        MapperMethod.ParamMap<Object> pm=new MapperMethod.ParamMap<Object>();
        pm.put("record", record);
        pm.put("example", example);
        String updateId= MybatisUtil.getNamespace(record.getClass())+ExampleEnum.updateByExample;
        int obj=this.dataSourceSupport.update(updateId, pm);
        return obj;
    }

    /**
     * 有选择性的通过example更新数据对象（对象属性为空不更新到db）
     * @param record 数据对象
     * @param example 帮助䣂
     * @return 更新数据条数
     */
    public int updateByExampleSelective(Object record,Object example){
        MapperMethod.ParamMap<Object> pm=new MapperMethod.ParamMap<Object>();
        pm.put("record", record);
        pm.put("example", example);
        String updateId= MybatisUtil.getNamespace(record.getClass())+ExampleEnum.updateByExampleSelective;
        int obj=this.dataSourceSupport.update(updateId, pm);
        return obj;
    }

    /**
     * 有选择性的通过主键更新数据对象（对象属性为空不更新到db）
     * @param record 数据对象
     * @return 更新数据条数
     */
    public int updateByPrimaryKeySelective(Object record) {
        String updateId= MybatisUtil.getNamespace(record.getClass())+ExampleEnum.updateByPrimaryKeySelective;
        int obj=this.dataSourceSupport.update(updateId, record);
        return obj;
    }

    /**
     * 通过主键更新数据对象
     * @param record 数据对象
     * @return 更新的数据条数
     */
    public  int updateByPrimaryKey(Object record) {
        String updateId= MybatisUtil.getNamespace(record.getClass())+ExampleEnum.updateByPrimaryKey;
        int obj=this.dataSourceSupport.update(updateId, record);
        return obj;
    }

    @Override
    public int updateByExampleWithBLOBs(Object record, Object example) {
        MapperMethod.ParamMap<Object> pm=new MapperMethod.ParamMap<Object>();
        pm.put("record", record);
        pm.put("example", example);
        String updateId= MybatisUtil.getNamespace(record.getClass())+ExampleEnum.updateByExampleWithBLOBs;
        int obj=this.dataSourceSupport.update(updateId, pm);
        return obj;
    }

    @Override
    public int updateByPrimaryKeyWithBLOBs(Object record) {
        String updateId= MybatisUtil.getNamespace(record.getClass())+ExampleEnum.updateByPrimaryKeyWithBLOBs;
        int obj=this.dataSourceSupport.update(updateId, record);
        return obj;
    }

    /**
     * 通过主键删除数据对象
     * @param cls 数据对象class
     * @param key 主键
     * @param <M> 数据对象类型
     * @return 删除数据条数
     */
    public <M> int deleteByPrimaryKey(Class<M> cls,Object key){
        String deleteId= MybatisUtil.getNamespace(cls)+ExampleEnum.deleteByPrimaryKey;
        int count=this.dataSourceSupport.delete(deleteId, key);
        return count;
    }

    /**
     * 通过Example分页查询数据对象集合
     * @param example 帮助类
     * @param page 页码
     * @param size 大小
     * @param <M> 数据对象类型
     * @param <M> 帮助类
     * @return 数据对象集合
     */
    public <M,E> List<M> selectByExampleForPage(E example, int page,int size){
        String selectId= MybatisUtil.getNamespace(example.getClass())+ExampleEnum.selectByExample;
        //int offset=(page-1)*size;
        RowBounds rowBounds = new RowBounds(page, size);
        List<M> ls=this.dataSourceSupport.selectLimitedList(selectId, example, rowBounds);
        return ls;
    }

    @Override
    public <M, E> List<M> selectByExampleForPage(E example, RowBounds rowBounds) {
        String selectId= MybatisUtil.getNamespace(example.getClass())+ExampleEnum.selectByExample;
        //int offset=(page-1)*size;
        List<M> ls=this.dataSourceSupport.selectLimitedList(selectId, example, rowBounds);
        return ls;
    }

    /**
     * 通过Example分页查询数据对象到DataPager
     * @param example 帮助䣂
     * @param pager 分页类
     * @param <M> 数据对象类型
     * @param <E> 帮助类
     * @return
     */
    public <M,E> DataPager<M> selectDataPager (E example, Pager pager){
        String selectId= MybatisUtil.getNamespace(example.getClass())+ExampleEnum.selectByExample;
        RowBounds rowBounds = new RowBounds(pager.getPage(), pager.getSize());
        List<M> ls=this.dataSourceSupport.selectLimitedList(selectId, example, rowBounds);

        DataPager dataPager=new DataPager(pager);
        dataPager.setRows(ls);
        PageInfo page = new PageInfo(ls);
        dataPager.setTotalPage(page.getPages());
        dataPager.setTotal(page.getTotal());
        return  dataPager;
    }

}
